package com.learning.netease.io.nio;

import lombok.extern.slf4j.Slf4j;

import java.nio.ByteBuffer;

/**
 * ClassName: BufferDemo
 * Description: Buffer 缓冲区
 * Date: 2021/1/10 22:33 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
@Slf4j
public class BufferDemo {
    public static void main(String[] args) {
        // 构建一个byte字节缓冲区，容量是4
        ByteBuffer byteBuffer = ByteBuffer.allocate(4);
        // 默认写入模式，查看三个重要的指标
        log.info("初始化：capacity容量：{}, position位置：{}, limit限制：{}", byteBuffer.capacity(),
                byteBuffer.position(), byteBuffer.limit());

        // 写入3字节的数据
        byteBuffer.put((byte) 1);
        byteBuffer.put((byte) 2);
        byteBuffer.put((byte) 3);
        // 再看数据
        log.info("写入3字节后，capacity容量：{}, position位置：{}, limit限制：{}", byteBuffer.capacity(),
                byteBuffer.position(), byteBuffer.limit());


        // 转换为读取模式(不调用flip方法，也是可以读取数据的，但是 position 记录读取的位置不对)
        log.info("####### 开始读取 #######");
        byteBuffer.flip();
        byte a = byteBuffer.get();
        log.info(String.valueOf(a));
        byte b = byteBuffer.get();
        log.info(String.valueOf(b));
        log.info("读取2字节数据后，capacity容量：{}, position位置：{}, limit限制：{}", byteBuffer.capacity(), byteBuffer.position(), byteBuffer.limit());

        // 继续写入3字节，此时读模式下，limit=3，position=2.继续写入只能覆盖写入一条数据
        // clear()方法清除整个缓冲区。compact()方法仅清除已阅读的数据。转为写入模式
        log.info("####### 开始切换写入 #######");
        byteBuffer.compact(); // buffer : 1 , 3
        byteBuffer.put((byte) 3);
        byteBuffer.put((byte) 4);
        byteBuffer.put((byte) 5);
        log.info("最终的情况，capacity容量：{}, position位置：{}, limit限制：{}", byteBuffer.capacity(),
                byteBuffer.position(), byteBuffer.limit());

        // rewind() 重置position为0
        // mark() 标记position的位置
        // reset() 重置position为上次mark()标记的位置

    }
}
